package com.hyl.reflect;



import com.hyl.entity.Student;
import org.junit.Test;

import javax.sound.midi.Soundbank;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @Description 类的基本信息
 * @Author hyl
 * @Date 2023/4/14 10:08
 **/
public class ReflectionInfo {

	@Test
	public void loadClass() throws ClassNotFoundException {
		//获取类的实例
		Student student = null;
		student.show();

		//通过放射-1
		Class tmp1 = student.getClass(); //如果我已经得到了这个类的对象==》说明已经知道了类的结构==》想使用属性、方法，直接使用==》没用
		Class tmp2 = Student.class; //类名.class==》需要引用包==》异常==》不建议使用
		Class tmp3 = Class.forName("com.hyl.entity.Student"); //通过全限定名，获取类对象

	}

	//@Test //基本信息 p5 1-1
	public void ClassInfo(Class tmp3) throws ClassNotFoundException {
		//Class tmp3 = Class.forName("com.hyl.entity.Student"); //通过全限定名，获取类对象
		//基本信息
		System.out.println("--类的基本信息--");
		System.out.println("包："+tmp3.getPackage());
		System.out.println("父类："+tmp3.getSuperclass());
		System.out.println("接口："+tmp3.getInterfaces());
		System.out.println("类名："+tmp3.getSimpleName());
		System.out.println("全限定名："+tmp3.getName());

	}

	@Test //构造方法 p8 1-2
	public void ConstructInfo() throws ClassNotFoundException {
		Class tmp3 = Class.forName("com.hyl.entity.Student"); //通过全限定名，获取类对象
		//基本信息
		System.out.println("--类的构造方法--");
		Constructor[] constructors =  tmp3.getDeclaredConstructors();
		for (Constructor tmp : constructors){
			System.out.println("访问修饰符："+tmp.getModifiers());
			System.out.println("参数个数："+tmp.getParameterCount());
			System.out.println("参数类型："+ Arrays.toString(tmp.getParameterTypes()));
			System.out.println();
		}
	}

	@Test //字段/属性 p9 1-3
	public void fieldInfo() throws ClassNotFoundException {
		Class tmp3 = Class.forName("com.hyl.entity.Student"); //通过全限定名，获取类对象
		//基本信息
		System.out.println("--类的字段/属性--");
		Field[] fields = tmp3.getDeclaredFields();
		for(Field tmp : fields) {
			System.out.println("访问修饰符："+tmp.getModifiers());
			System.out.println("数据类型："+tmp.getType());
			System.out.println("属性名："+tmp.getName());
			System.out.println();
		}

	}

	@Test //方法 p11 1-4
	public void methodInfo() throws ClassNotFoundException {
		Class tmp3 = Class.forName("com.hyl.entity.Student"); //通过全限定名，获取类对象
		//基本信息
		System.out.println("--类的方法--");
		Method[] methods = tmp3.getDeclaredMethods();
		for (Method tmp : methods) {
			System.out.println("访问修饰符："+tmp.getModifiers());
			System.out.println("返回值类型："+tmp.getReturnType());
			System.out.println("方法名："+tmp.getName());
			System.out.println("参数："+Arrays.toString(tmp.getParameterTypes()));
			System.out.println();
		}

	}

}
